iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0

  諸位早安,我們終於結束漫長的資料前處理教學了。之前在講前處理的過程中,我一直提到電腦很笨,只認得數字的事情,大家應該還記得吧。問題來了,我們到底要怎麼把文字轉換成電腦認得數字呢?今天就來解密這個一直被我含糊帶過的重要步驟吧。(來個柯南開場主題曲

Bag of Words (BOW, 詞袋模型)

  BOW,顧名思義就是把詞彙裝到袋子裡面的模型。會特別選擇袋子作為容器的原因就是,東西放在裡面各種晃動之後,基本沒有什麼規律可言,你不會知道一個東西當初到底是先放進去還是後放進去的。雖然是這樣啦,也不是隨便拿到什麼就都放進去。為了明確放東西進去的標準,我們需要先釐清tokentype之間的差異。token指的是資料裡面每個被斷成詞的單位,而type指的則是資料裡面被斷成詞且長相不同的單位。舉個例:

資料 token type
鳴人|跟|雛田|結婚|了 5 5
佐助|跟|小櫻|結婚|了 5 5
鳴人|跟|佐助|才是|真愛 5 5
總和 15 9

  在上面的例子裡面,token單純就是把三個句子的總詞數相加而已,但type就不一樣了,因為「鳴人」、「佐助」、「跟」、「結婚」、「了」都是重複出現的詞,每次出現長得都一樣,所以各自只能算做一個type。我們要放進袋子裡面的就是這些type。大家可以把詞袋想像成一個紀錄資料裡面出現過哪些詞的倉庫。因為我們只需要知道誰出現過,放type進去就可以了。如果我們把上面的例子當成一個語料庫,那這個詞袋就會長這個樣子(鳴人, 佐助, 雛田, 小櫻, 結婚, 才是, 真愛, 了)(詞袋裡面沒有順序,這只是隨機出來的結果)。有了這個東西,我們就可以開始把資料裡面的文字變成數字了。只要句子裡面出現這個type,我們就把它標示為1,如果沒有就標示為0,很簡單吧~所以第一句話的數字型態會是[1, 0, 1, 0, 1, 0, 0, 1],而電腦接收到的資訊也會是這些數字。這種用0跟1表示文字的方法就叫做one-hot encoding,是要把文字變成電腦可以認得的向量時,很常用的方法。

  把上面的例子再延伸到單一詞彙上面,如果我們有一個詞袋的話,就可以幫裡面的每一個詞彙產出屬於他們的身分證了。
https://ithelp.ithome.com.tw/upload/images/20220928/20151687LqHsh6dEgr.png

  就像上面這樣,對電腦來說,鳴人就是向量[1, 0, 0, 0, 0, 0, 0, 0]。看到這裡,可能有人開始產生「什麼是向量?」的疑問。首先讓我們回到國中數學,數線上的值我們稱為一維向量,因為線是最簡單的一個維度。接下來進到座標系統以後,出現了面,也因此有了第二個維度,所以我們把座標平面上的點稱為二維向量,用 (x, y) 來表示。接著到了高中我們進到空間概念的時候,多了z軸。這個z軸就成了第三個維度,上面的線就可以用三維向量[x, y, z]來表示。以上是人類可以感知到的最大維度。透過數學跟物理的概念雖然可以想像出第四維度,但那已經超出我們生活的範圍了。我們可以把詞袋模型裡面的每一個type想像成一個維度,如果像上面的例子一樣有8個type(上圖不小心漏了「跟」,先將錯就錯當成8個),那就可以當成他們在電腦裡面形成了一個8維空間,每一個詞在這裡面都佔有自己的位置也可以用向量表示出來。

  當然這個方法也不是完美無缺的,一般來說詞袋模型公認有下面三個缺點:

  1. 維度災難/詛咒(curse of dimensionality)

    所謂的維度災難或維度詛咒指涉的是當維度太多,造成計算量急劇增加且難以解決的現象。剛剛提到我們要把每個詞都想像成一個維度,在例子裡面看起來也確實很簡單,但真實情況是語料庫裡面會有成千上萬的word type會形成成千上萬個維度,計算起來也會變得超級複雜,我們的電腦通常難以負擔這樣的計算量。

  2. 稀疏度(sparsity)太高

    使用詞袋模型的時候,如果有一個句子叫做「鳴人跟佐助」,那麼我們就需要在代表「鳴人」、「跟」、「佐助」的維度標上1。聽起來也是很簡單,但如果語料庫裡面總共有2000個type,那這句話標出來的向量就會有1997個0,比對我們來說有用的1還要多太多了。也就是說當我們在使用詞袋模型進行one-hot encoding的時候,會產生很多沒用的0。稀疏度(sparsity) 就是用來形容0的多寡的一個詞彙,0越多代表資料的稀疏度越高。這些沒用的0容易在模型訓練的時候變成一種讓模型誤會分類特徵的雜訊,所以需要特別注意。但是反過來說,我們也可以拿稀疏度來當作文本詞彙豐富程度的一個參考指標,因為出現的word type越多就需要越多維度,也會產生越多0。

  3. 忽略自然語言特徵

    如果你還記得的話,之所以會叫詞袋模型就是因為東西放到袋子裡面之後就無法得知原本的順序了。對詞袋模型來說,type的順序並不重要,有沒有被標住起來才是重點。但是!詞彙的出現順序其實對語意有很大的影響。舉例來說:

    鳴人愛佐助
    佐助愛鳴人

    這兩個句子指的就是完全不一樣的事情。鳴人愛佐助並不代表佐助愛鳴人,佐助愛鳴人也不代表鳴人就一定愛佐助。但是對BOW來說他們都只是「鳴人」、「愛」跟「佐助」被標起來的同樣一個向量而已。因為這樣,如果我們把這個東西當成一種特徵去訓練模型的話,就會忽略掉語序跟語序所代表的語意差異。

  以上就是Bag of Words的簡單介紹跟缺點分析,而關於這些缺點的解決方案,我會在接下來的系列文章慢慢帶到,大家敬請期待~明天見!


參考資料

  1. NLP的基本執行步驟(II) — Bag of Words 詞袋語言模型
  2. 維度災難 維基百科
  3. How Sparsity Adds Umph to AI Inference

上一篇
[Day 13] 資料視覺化實作:把斷詞結果變成比文字雲更酷炫的文字狗跟文字小新
下一篇
[Day 15] 機器學習常用特徵:詞頻的皇親國戚-N-Gram & TF-IDF
系列文
文理組人都能上手的入門 NLP(自然語言處理)31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言